#ifndef __CKEY_H__
#define __CKEY_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <stdbool.h>
#include <stdint.h>

#define DEFAULT_KEY_SCAN_INTERVAL 10
#define DEFAULT_KEY_STABLE_TIME 40
#define DEFAULT_MULTIPLE_CLICK_DURATION 1000
#define DEFAULT_LONG_PRESS_DURATION 3000

typedef enum {
    KEY_RELEASE,
    KEY_PRESS,
    KEY_CLICK,
    KEY_LONG_PRESS,
    KEY_MULTIPLE_CLICK,
} KEY_ENUM;

typedef struct key_handle_struct key_handle_t;

typedef bool (*key_press_func)(void);
typedef void (*key_even_cb)(struct key_handle_struct *handle, KEY_ENUM status);

struct key_list
{
    struct key_list *next;
    struct key_list *prev;
};

typedef struct key_handle_struct {
    struct key_list *next;
    struct key_list *prev;

    KEY_ENUM status;
    uint8_t multiple_count;
    uint16_t even_tick;

    key_press_func is_key_press;
    key_even_cb key_even;

    /* setting */
    uint16_t stable_time;
    uint16_t multiple_click_duration;
    uint16_t long_press_duration;
} key_handle_t;

void Key_InitSetting(key_handle_t *handle, key_press_func key_down_func, key_even_cb key_even_cb);
void Key_Handler(void);
void Key_SetInterval(int ms);
int Key_GetMultipleCount(key_handle_t *handle);
void Key_Add(key_handle_t *handle);
void Key_Remove(key_handle_t *handle);
bool Key_IsRelease(key_handle_t *handle);

#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif
